package com.dragons.dragonsvf.utils.video_compress;//package com.dragons.video_compress;
//
///**
// * @author Dragons.G
// * @date 2025-03-18 21:43:01
// * @description 利用ffmpeg对视频进行无损压缩
// */
//import java.io.BufferedReader;
//import java.io.IOException;
//import java.io.InputStream;
//import java.io.InputStreamReader;
//import java.nio.file.Files;
//import java.nio.file.Path;
//import java.nio.file.StandardCopyOption;
//
//public class VideoCompressionFfempegUtil {
//
//    private static final String FFMPEG_RESOURCE_PATH = "ffmpeg/ffmpeg";
//
//    /**
//     * 获取项目内的 FFmpeg 可执行文件路径
//     * @return FFmpeg 可执行文件的路径
//     * @throws IOException 当复制文件或获取文件路径时发生 I/O 错误
//     */
//    private static String getFFmpegPath() throws IOException {
//        // 获取当前操作系统
//        String os = System.getProperty("os.name").toLowerCase();
//        String ffmpegFileName = os.contains("win") ? "ffmpeg/ffmpeg.exe" : "ffmpeg";
//
//        // 获取 FFmpeg 资源的输入流
//        InputStream ffmpegStream = VideoCompressionFfempegUtil.class.getClassLoader().getResourceAsStream(FFMPEG_RESOURCE_PATH + (os.contains("win") ? ".exe" : ""));
//        if (ffmpegStream == null) {
//            throw new IOException("FFmpeg 资源未找到");
//        }
//
//        // 创建临时文件
//        Path tempFFmpeg = Files.createTempFile("ffmpeg", ffmpegFileName);
//        tempFFmpeg.toFile().deleteOnExit();
//
//        // 将资源复制到临时文件
//        Files.copy(ffmpegStream, tempFFmpeg, StandardCopyOption.REPLACE_EXISTING);
//
//        // 设置文件可执行权限（仅适用于 Linux/Mac）
//        if (!os.contains("win")) {
//            tempFFmpeg.toFile().setExecutable(true);
//        }
//
//        return tempFFmpeg.toString();
//    }
//
//    /**
//     * 对视频进行无损压缩，并可调整缩放比和压缩比
//     * @param inputFilePath 输入视频文件路径
//     * @param outputFilePath 输出视频文件路径
//     * @param scale 缩放比，例如 0.5 表示缩小为原来的一半
//     * @param crf 压缩比，取值范围 0 - 51，值越小质量越高
//     * @throws IOException 当执行 FFmpeg 命令时发生 I/O 错误
//     * @throws InterruptedException 当执行 FFmpeg 命令的线程被中断
//     */
//    public static void compressVideo(String inputFilePath, String outputFilePath, double scale, int crf) throws IOException, InterruptedException {
//        String ffmpegPath = getFFmpegPath();
//
//        // 构建 FFmpeg 命令
//        ProcessBuilder processBuilder = new ProcessBuilder(
//            ffmpegPath,
//            "-i", inputFilePath,
//            "-vf", "scale=iw*" + scale + ":ih*" + scale,
//            "-c:v", "libx264",
//            "-preset", "ultrafast",
//            "-crf", String.valueOf(crf),
//            "-c:a", "copy",
//            outputFilePath
//        );
//
//        // 启动进程
//        Process process = processBuilder.start();
//
//        // 处理 FFmpeg 的标准输出和错误输出
//        handleStream(process.getInputStream());
//        handleStream(process.getErrorStream());
//
//        // 等待进程执行完成
//        int exitCode = process.waitFor();
//        if (exitCode != 0) {
//            throw new RuntimeException("FFmpeg 命令执行失败，退出码: " + exitCode);
//        }
//    }
//
//    /**
//     * 处理输入流，将流中的内容打印到控制台
//     * @param inputStream 要处理的输入流
//     * @throws IOException 当读取输入流时发生 I/O 错误
//     */
//    private static void handleStream(InputStream inputStream) throws IOException {
//        try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
//            String line;
//            while ((line = reader.readLine()) != null) {
//                System.out.println(line);
//            }
//        }
//    }
//
//    public static void main(String[] args) {
//        String inputFilePath = "C:\\D-Files\\Belife\\Black_House\\qrcode_annotation\\src\\main\\java\\com\\dragons\\video_compress\\videos\\原始.mp4";
//        String outputFilePath = "C:\\D-Files\\Belife\\Black_House\\qrcode_annotation\\src\\main\\java\\com\\dragons\\video_compress\\videos\\压缩.mp4";
//        double scale = 1.0; // 缩放比为 0.5
//        int crf = 18; // 压缩比为 18
//
//        try {
//            compressVideo(inputFilePath, outputFilePath, scale, crf);
//            System.out.println("视频压缩完成");
//        } catch (IOException | InterruptedException e) {
//            e.printStackTrace();
//        }
//    }
//}
